/* Copyright Statement:
 *
 * This software/firmware and related documentation ("AutoChips Software") are
 * protected under relevant copyright laws. The information contained herein is
 * confidential and proprietary to AutoChips Inc. and/or its licensors. Without
 * the prior written permission of AutoChips inc. and/or its licensors, any
 * reproduction, modification, use or disclosure of AutoChips Software, and
 * information contained herein, in whole or in part, shall be strictly
 * prohibited.
 *
 * AutoChips Inc. (C) 2021. All rights reserved.
 *
 * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
 * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
 * RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
 * ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
 * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
 * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
 * INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
 * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
 * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
 * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
 * SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
 * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
 * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
 * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
 * RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
 * AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
 * CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
 */

/*!
 * @file system_ac7840x.c
 *
 * @brief This file provides system clock config integration functions.
 *
 */

/* ===========================================  Includes  =========================================== */
#include "ckgen_drv.h"

/* ============================================  Define  ============================================ */

/* ===========================================  Typedef  ============================================ */

/* ==========================================  Variables  =========================================== */
uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;  /* Core clock */

/* ====================================  Functions declaration  ===================================== */

/* Externals declaration */
#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
extern uint32_t __Vectors;
#endif

/* ======================================  Functions define  ======================================== */
/*!
 * @brief Get MCU CPUID
 *
 * @param[in] none
 * @return MCU UUID
 */
uint32_t GetCPUID(void)
{
    return SCB->CPUID;
}

/*!
 * @brief Get UUID from devie
 *
 * @param[out] uuidBuffer: UUID buffer
 * @return none
 */
void GetUUID(uint32_t *uuidBuffer)
{
#define UUID_BASE_ADDRESS  0x00201800U

    uint8_t i = 0U;

    if (uuidBuffer != NULL)
    {
        for (i = 0U; i < 4U; i++)
        {
            uuidBuffer[i] = (*(__IO uint32_t *)(UUID_BASE_ADDRESS  + i * 4U));
        }
    }
}

/*!
 * @brief Setup the microcontroller system. Initialize the System.
 *
 * @param[in] none
 * @return none
 */
void SystemInit(void)
{
    /* Sram L&U ECC read enable */
#if (SRAM_ECC_READ_ENABLE)
    MCM->MLMDR0 |= MCM_MLMDR0_LREEN_Msk | MCM_MLMDR0_UREEN_Msk;
    /* Sram ECC error reset disable */
#if !(SRAM_ECC_ERR_RST_ENABLE)
    CKGEN->RCM_EN &= ~CKGEN_RCM_EN_ECC2_ERR_RST_EN_Msk;
#endif
#endif

#if (__FPU_PRESENT == 1U) && (__FPU_USED == 1U)
    SCB->CPACR |= ((3U << (10U * 2U)) | (3U << (11U * 2U))); /* set CP10 and CP11 Full Access */
#endif

    /* Watchdog disable */
#if (WDG_DISABLE)
#define WDG_UNLOCK_VALUE1      0xE064D987U
#define WDG_UNLOCK_VALUE2      0x868A8478U
    WDG->CNT = (uint32_t)WDG_UNLOCK_VALUE1;
    WDG->CNT = (uint32_t)WDG_UNLOCK_VALUE2;
    WDG->CS0 &= ~WDG_CS0_EN_Msk;
#endif

    /* Wait PC8 GPIO input high for debug */
#if (WAIT_PC8_HIGH_ENABLE)
    PORTC->PCR[8] = 0x00007908U;
    uint32_t i = 0x400000U;
    while((!(GPIOC->PIDR & 0x100U)) && (i--));
#endif

#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)
    //SCB->VTOR = (uint32_t) &__Vectors;
#endif
}

/*!
 * @brief Get system clock frequence.
 *
 * @param[in] none
 * @return none
 */
void SystemCoreClockUpdate(void)
{
    (void)CKGEN_DRV_GetFreq(CORE_CLK, &SystemCoreClock);
}

/* =============================================  EOF  ============================================== */
